wayland: Schedule a clock tick instead of wl_surface_commit()ting directly
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 4 Nov 2014 18:26:25 +0000 (19:26 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 7 Nov 2014 16:24:10 +0000 (17:24 +0100)
Instead of possibly calling wl_surface_commit() out of
GdkFrameClock::after-paint, tick the transient parent clock so ::after-paint
can be eventually run.

This ensures that the subsurface coordinates (considered part of the state
of the parent) aren't committed untimely, and guaranteed to be orderly with
the wl_subsurface-relative state.

This is a gtk-side fix for https://bugzilla.gnome.org/show_bug.cgi?id=738887

gdk/wayland/gdkwindow-wayland.c

index b49dda32fef882fcaab44faccb38c45ddee3aa14..a7e23b52d8333889eb17ac6d72fcc7c689f530fa 100644 (file)
@@ -1283,6 +1283,32 @@ gdk_window_wayland_restack_toplevel (GdkWindow *window,
 {
 }
 
+static void
+gdk_window_request_transient_parent_commit (GdkWindow *window)
+{
+  GdkWindowImplWayland *window_impl, *impl;
+  GdkFrameClock *frame_clock;
+
+  window_impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+  if (!window_impl->transient_for)
+    return;
+
+  impl = GDK_WINDOW_IMPL_WAYLAND (window_impl->transient_for->impl);
+
+  if (!impl->surface || impl->pending_commit)
+    return;
+
+  frame_clock = gdk_window_get_frame_clock (window_impl->transient_for);
+
+  if (!frame_clock)
+    return;
+
+  impl->pending_commit = TRUE;
+  gdk_frame_clock_request_phase (frame_clock,
+                                 GDK_FRAME_CLOCK_PHASE_AFTER_PAINT);
+}
+
 static void
 gdk_window_wayland_move_resize (GdkWindow *window,
                                 gboolean   with_move,
@@ -1305,15 +1331,8 @@ gdk_window_wayland_move_resize (GdkWindow *window,
 
           if (impl->subsurface)
             {
-              GdkWindowImplWayland *parent_impl;
-
               wl_subsurface_set_position (impl->subsurface, x, y);
-
-              g_assert (impl->transient_for != NULL);
-              parent_impl = GDK_WINDOW_IMPL_WAYLAND (impl->transient_for->impl);
-
-              if (parent_impl->surface && !parent_impl->pending_commit)
-                wl_surface_commit (parent_impl->surface);
+              gdk_window_request_transient_parent_commit (window);
             }
         }
     }